home *** CD-ROM | disk | FTP | other *** search
- var ybookmark_Utils = {
-
- getAllTags: function() {
- return ybookmarksMain.gBookmarks.getTags(null, {});
- },
-
- getPopularTags: function(aCount) {
-
- if ( !aCount ) {
- aCount = 20;
- }
- var result = new Array();
- var topWindow = this._getTopWindow();
- var order = "descending";
- var column = topWindow.document.getElementById( "bookmark-tags-tree-count-col" );
- var sortResource = column.getAttribute( "sort" );
- var tree = topWindow.document.getElementById( "bookmark-tags-tree" );
- tree.hidden = false;
-
- this._sortBookmarks( tree, column, sortResource, order );
- var totalRows = tree.view.rowCount;
- var tagColumn = tree.columns.getNamedColumn( "bookmark-tags-tree-tag-col" );
-
- for ( var counter = 0; counter < totalRows && counter < aCount; ++counter ) {
- var tag = tree.view.getCellText ( counter, tagColumn );
- result.push ( tag );
- }
-
- return result;
- },
-
- getBookmarksForTag: function(aTag) {
- return ybookmarksMain.gBookmarks.getBookmarks(aTag, {});
- },
-
- /* note that this function sorts the array in place */
- sortBookmarks: function (bookmarks, aOrder) {
- var func = null;
-
- if (aOrder == "chrono") {
- func = function(a, b) { return a.added_date - b.added_date; };
- } else if (aOrder == "chrono_reverse") {
- func = function(a, b) { return b.added_date - a.added_date; };
- }
-
- if (func != null) {
- bookmarks.sort(func);
- }
- },
-
- _getIntersectingBookmarks: function(aArrays) {
- var bookmarks = {};
- var result = [];
-
- for (var i=0; i < aArrays.length; i ++) {
- var array = aArrays[i];
- for (var j=0; j < array.length; j++) {
- var key = array[j].id;
- if (bookmarks[key] == undefined) {
- bookmarks[key] = { count: 1,
- bm: array[j]};
- } else {
- bookmarks[key].count++;
- }
- }
- }
-
- for each (var bm in bookmarks) {
- if (bm.count == aArrays.length) {
- result.push(bm.bm);
- }
- }
- return result;
- },
-
- /* returns a conjunction of the tags in the sorted order */
- getBookmarksForTagOrdered: function(aTags, aOrder) {
- try {
- var tags = aTags.split(/\++/);
- var args = [];
-
- for (var i=0; i < tags.length; i++) {
- var t = tags[i];
- if (t != "") {
- args.push(this.getBookmarksForTag(t));
- }
- }
-
- var bm = this._getIntersectingBookmarks(args);
- this.sortBookmarks(bm, aOrder);
- return bm;
- } catch (e) {
- yDebug.print("getBookmarksForTagOrdered(" + aTags + "): " + e);
- return [];
- }
- },
-
- getSortedBookmarks: function(aSortColumn, aCount) {
-
- var result = new Array();
- if ( !aCount ) {
- // set it to max elements
- aCount = 99999999999;
- }
-
- var topWindow = this._getTopWindow();
- var order = "descending";
- var column = topWindow.document.getElementById( aSortColumn );
- var sortResource = column.getAttribute( "sort" );
- var tree = topWindow.document.getElementById( "bookmark-sort-tree" );
- tree.hidden = false;
-
- this._sortBookmarks( tree, column, sortResource, order );
- var totalRows = tree.view.rowCount;
- var urlColumn = tree.columns.getNamedColumn( "bookmark-sort-tree-url-col" );
-
- var index = 0;
- for ( var rowCounter = 0; rowCounter < totalRows && index < aCount; ++rowCounter ) {
- var url = tree.view.getCellText ( rowCounter, urlColumn );
-
- var bookmark = ybookmarksMain.gBookmarks.getBookmark( url );
- if (!bookmark ||
- ybookmarksMain.gBookmarks.resolveBookmarkResourceType(ybookmarksMain.gBookmarks.isBookmarked(url)) == "LiveBookmark" ) {
- continue;
- }
-
- ++index;
- result.push ( bookmark );
- }
-
- return result;
- },
-
- getFrequentBookmarks: function(aCount) {
- return this.getSortedBookmarks ( "bookmark-sort-tree-visitcount-col", aCount );
- },
-
- getRecentBookmarks: function(aCount) {
- return this.getSortedBookmarks ( "bookmark-sort-tree-visitdate-col", aCount );
- },
-
- getRecentlySavedBookmarks: function(aCount) {
- return this.getSortedBookmarks ( "bookmark-sort-tree-adddate-col", aCount );
- },
-
- addEmptyMenuItem: function(parent) {
- var menuItem = this.createMenuItem("(Empty)", "", "", "" );
- menuItem.setAttribute( "disabled", "true" );
- parent.appendChild ( menuItem );
- },
-
- removeAllMenuItems: function(menuPopup) {
- while (menuPopup.firstChild) {
- menuPopup.removeChild ( menuPopup.firstChild );
- }
- },
-
- getLinksForTag: function (tag) {
- var linksForTags = {
- "digital art": [
- { "link": "http://www.adobe.com",
- "title": "Adobe Tools"
- },
- { "link": "http://www.macromedia.com",
- "title": "Macromedia vector art tools"
- },
- ],
- "photoshop": [
- { "link": "http://www.adobe.com",
- "title": "Adobe tools"
- },
- { "link": "http://store.adobe.com/type/index.html",
- "title": "Adobe type library"
- }
- ],
- "illustration": [
- { "link": "http://www.adobe.com",
- "title": "Adobe tools"
- },
- { "link": "http://www.macromedia.com",
- "title": "macromedia vector art tools"
- }
- ]
- };
- if ( linksForTags[ tag ] )
- return linksForTags[ tag ];
-
- return null;
- },
-
- createMenuItem: function(aDisplayName, aAccessKey, aCommandName, aImage) {
- var xulElement = document.createElementNS(gYBXUL_NS, "menuitem");
- xulElement.setAttribute("label", aDisplayName);
- xulElement.setAttribute("accesskey", aAccessKey);
- xulElement.setAttribute("command", aCommandName);
- xulElement.setAttribute("class", "menuitem-iconic bookmark-item");
- xulElement.setAttribute("image", aImage);
- return xulElement;
- },
-
- _sortBookmarks: function(tree, column, sortResource, order ) {
- //To address changes in FF3
- if(ybookmarksUtils.getFFMajorVersion() > 2) {
- if(order == "descending") {
- order = "ascending";
- }
- column.setAttribute( "sortDirection", order );
- tree.view.sort(column);
- } else {
- const nsIXULSortService = Components.interfaces.nsIXULSortService;
- const isupports_uri = "@mozilla.org/xul/xul-sort-service;1";
- var xulSortService =
- Components.classes[isupports_uri].getService(nsIXULSortService);
- xulSortService.sort(tree, sortResource, order );
- tree.builder.QueryInterface( Components.interfaces.nsIXULTreeBuilder ).sort( column );
- column.setAttribute( "sortDirection", order );
- column.setAttribute( "sortActive", "true" );
- tree.builder.rebuild();
- }
- // tree.builder.refresh();
- },
-
- _getTopWindow : function() {
- var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
- var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
- var topWindow = windowManagerInterface.getMostRecentWindow( "navigator:browser" );
-
- return topWindow;
- }
- };
-
- const gYB_bms = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
- getService(Components.interfaces.nsIYBookmarksStoreService);
- const gYB_rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"].
- getService(Components.interfaces.nsIRDFService);
- const gYB_rscIcon = gYB_rdfs.GetResource("http://home.netscape.com/NC-rdf#Icon");
-
- function gYB_b64(aBytes) {
- const B64_CHARS =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var out = "", bits, i, j;
-
- var k = 0;
- while ((aBytes.length - k) >= 3) {
- bits = 0;
- for (i = 0; i < 3; i++) {
- bits <<= 8;
- bits |= aBytes[k];
- k++;
- }
- for (j = 18; j >= 0; j -= 6)
- out += B64_CHARS[(bits>>j) & 0x3F];
- }
-
- switch (aBytes.length - k) {
- case 2:
- out += B64_CHARS[(aBytes[k]>>2) & 0x3F];
- out += B64_CHARS[((aBytes[k] & 0x03) << 4) | ((aBytes[k+1] >> 4) & 0x0F)];
- out += B64_CHARS[((aBytes[k + 1] & 0x0F) << 2)];
- out += "=";
- break;
- case 1:
- out += B64_CHARS[(aBytes[k]>>2) & 0x3F];
- out += B64_CHARS[(aBytes[k] & 0x03) << 4];
- out += "==";
- break;
- }
- return out;
- }
-
- function gYB_getMimeType(data, length) {
- const catMgr = Components.classes["@mozilla.org/categorymanager;1"]
- .getService(Components.interfaces.nsICategoryManager);
- var sniffers = catMgr.enumerateCategory("content-sniffing-services");
- var mimeType = null;
- while (mimeType == null && sniffers.hasMoreElements()) {
- var snifferCID = sniffers.getNext().QueryInterface(Components.interfaces.nsISupportsCString)
- .toString();
- var sniffer = Components.classes[snifferCID].getService(Components.interfaces.nsIContentSniffer);
- try {
- mimeType = sniffer.getMIMETypeFromContent(data, length);
- } catch (e) {
- mimeType = null;
- }
- }
- return mimeType;
- }
-
- function gYB_saveIcon(ds, resource, data, length) {
- if (length > 0) {
- var mimeType = gYB_getMimeType(data, length);
- if (mimeType) {
- var text = "data:" + mimeType + ";base64," + gYB_b64(data);
- var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
- var newIcon = gYB_rdfs.GetLiteral(text);
- if (oldIcon) {
- ds.Change(resource, gYB_rscIcon, oldIcon, newIcon, true);
- } else {
- ds.Assert(resource, gYB_rscIcon, newIcon, true);
- }
- }
- }
- }
-
- function gYB_loadFavIconNew(url, favIconUrl) {
- try {
-
- var resource = gYB_bms.isBookmarked(url);
-
- if (resource) {
- //Increment visit count of the bookmarked url
- var store = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
- getService(Components.interfaces.nsIYBookmarksStoreService);
- store.incrementVisitCount( url );
-
- var out = { value : -1 };
- var ds = gYB_bms.getDataSource();
- var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
- if (!oldIcon || oldIcon.QueryInterface(Components.interfaces.nsIRDFLiteral).Value == "data:") {
- /**
- * Check for FF version
- */
- if(ybookmarksUtils.getFFMajorVersion() > 2) {
- var faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
- .getService(Components.interfaces.nsIFaviconService);
- var ioservice = Components.classes["@mozilla.org/network/io-service;1"]
- .getService(Components.interfaces.nsIIOService);
- var pageURI = ioservice.newURI(url, null, null);
- var faviconLink = faviconService.getFaviconImageForPage(pageURI);
-
- if(faviconLink.spec) {
- var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
- var newIcon = gYB_rdfs.GetLiteral(faviconLink.spec);
- if (oldIcon) {
- ds.Change(resource, gYB_rscIcon, oldIcon, newIcon, true);
- } else {
- ds.Assert(resource, gYB_rscIcon, newIcon, true);
- }
- }
- }
- else {
- var chan = IOSVC.newChannel(favIconUrl, null, null);
- var listener = new bookmarksFavIconLoadListener(url, favIconUrl, chan);
- listener.onStopRequestOld = listener.onStopRequest;
- listener.onStopRequest = function(req, context, statusCode) {
- try {
- gYB_saveIcon(ds, resource, this.mBytes, this.mCountRead);
- this.onStopRequestOld(req, context, statusCode);
- } catch (e) {
- yDebug.print("Error in onStopRequest: " + e);
- }
- }
- chan.notificationCallbacks = listener;
- chan.asyncOpen(listener, null);
- }
- return true;
- }
- }
- return false;
- } catch (e) {
- yDebug.print("loadFavIconNew failed: " + e);
- return false;
- }
- }
-
- //check for FF version
- if(ybookmarksUtils.getFFMajorVersion() < 3) {
- /**
- * Intercept BookmarksUtils.loadFavIcon.
- */
- var gYB_loadFavIconOld = ybookmark_Utils._getTopWindow().BookmarksUtils.loadFavIcon;
-
- //Listen to favicon load only on standard mode.This is done for tracking visit count.
- if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_STANDARD) {
- ybookmark_Utils._getTopWindow().BookmarksUtils.loadFavIcon =
- function(url, favIconUrl) {
- if (! gYB_loadFavIconNew(url, favIconUrl)) {
- gYB_loadFavIconOld(url, favIconUrl);
- }
- };
- }
- }